// main.js
// Electron 目前只支持三个平台：win32 (Windows), linux (Linux) 和 darwin (macOS) 。
// 我们正在使用 Node.js 18.16.1, Chromium 116.0.5845.190, 和 Electron 26.2.4.
const {
  app, //管理事件生命周期
  BrowserWindow, //管理窗口
  globalShortcut, //监听按键
  screen, //显示器信息
  Tray, //右下角托盘
  Menu, //右下角托盘菜单
  ipcMain, //进程间通信 (IPC
  dialog,
} = require("electron");
const path = require("node:path");
// 第一个窗口
const createWindow = (url, op) => {
  const mainWindow = new BrowserWindow({
    width: 1024,
    height: 768,
    icon: __dirname + "/assets/ico/favicon.ico", // 图标的路径
    maximizable: true, //支持最大化
    show: false, //为了让初始化窗口显示无闪烁，先关闭显示，等待加载完成后再显示。
    autoHideMenuBar: true, //隐藏菜单
    nodeIntegrationInSubFrames: true, // 允许在子页面(iframe)或子窗口(child window)中集成Node.js
    webviewTag: true, // 允许在页面内使用webview标签
    nodeIntegration: true, // 是否集成 Nodejs
    // fullscreen: true,//是否全屏幕
    // transparent: true, // 窗口透明
    // frame: false, // 无边框
    title: "主窗口",
    //网页功能设置
    webPreferences: {
      nodeIntegration: true, // 是否集成 Nodejs
      preload: path.join(__dirname, "preload.js"),
      // webSecurity: false, //关闭web权限检查，允许跨域
      enableRemoteModule: true, //使用remote模块
      contextIsolation: false, //上下文隔离
    },

    // icon: path.join(__dirname, 'app.ico') // 设置ico
  });
  // mainWindow.openDevTools(); // 打开开发工具
  // mainWindow.loadURL("https://www.baidu.com"); //设置访问地址
  // mainWindow.loadURL("http://127.0.0.1:8081/"); //设置访问地址
  mainWindow.loadFile(url); // 加载 index.html
  // mainWindow.loadFile(); //加载文件
  // mainWindow.loadURL(); //加载链接
  // mainWindow.webContents.openDevTools(); //打开开发者工具
  // mainWindow.setContentBounds(); //控制窗口尺寸与位置
  // mainWindow.center(); //将窗口移动到屏幕中心
  // mainWindow.setTitle("主窗口"); //设置程序Title
  // mainWindow.maximize();//最大化
  // Menu.setApplicationMenu(null); //隐藏应用程序菜单.
  // mainWindow.setAutoHideMenuBar(true); //自动隐藏菜单
  // 全屏函数
  // mainWindow.setFullScreen(true);
  // mainWindow.setSimpleFullScreen(true);
  // 全屏状态判断
  // mainWindow.isFullScreen();
  // mainWindow.isSimpleFullScreen();
  // mainWindow.setKiosk(true); // 设置窗口为全屏显示
  // mainWindow.setFullScreen(true); //进入软件即开启全屏
  // mainWindow.setIgnoreMouseEvents(true); // 鼠标穿透
  // mainWindow.setAlwaysOnTop(true); // 保持置顶
  // mainWindow.setSkipTaskbar(true); // 无任务栏图标
  //创建系统通知区菜单(右下角托盘)
  tray = new Tray(path.join(__dirname, "/assets/ico/favicon.ico"));
  const contextMenu = Menu.buildFromTemplate([
    {
      label: "退出",
      click: () => {
        // mainWindow.close();
        mainWindow.destroy();
      },
    },
  ]);
  // tray.setToolTip("透明窗口托盘测试");
  tray.setContextMenu(contextMenu);

  // app.commandLine.appendSwitch("--disable-http-cache")   禁用缓存
  // mainWindow.loadFile('index.html')// 加载 index.html
  // 初始化后再显示
  mainWindow.on("ready-to-show", () => {
    mainWindow.show();
  });

  //禁止程序打开第二次, 第二次打开时会将焦点聚焦到上次打开的窗口.
  const gotTheLock = app.requestSingleInstanceLock();
  if (!gotTheLock) {
    app.quit();
  } else {
    app.on("second-instance", (event, commandLine, workingDirectory) => {
      // 当运行第二个实例时,将会聚焦到mainWindow这个窗口
      if (mainWindow) {
        if (mainWindow.isMinimized()) mainWindow.restore();
        mainWindow.focus();
        mainWindow.show();
      }
    });
  }

  //ESC键退出全屏
  globalShortcut.register("ESC", () => {
    console.log("ESC键");
  });

  // 监听窗口关闭
  mainWindow.on("close", (event) => {
    event.preventDefault(); //先阻止一下默认行为，不然直接关了，提示框只会闪一下
    console.log("窗口即将销毁");
    // dialog.showErrorBox('通知', '退出失败');
    // showMessageBox 显示一个消息框，它将阻止该过程，直到消息框关闭。它返回点击按钮的索引。
    const showMessageBoxTC = async (e) => {
      const sssd = await dialog
        .showMessageBox(mainWindow, {
          title: "提示",
          type: "info",
          buttons: ["确认", "取消"],
          message: "确认退出？",
        })
        .then((index) => {
          console.log("回调", index);
          if (index.response == 1) {
            console.log("index==1");
            // event.preventDefault();
          } else {
            console.log("index==0");
            // mainWindow.destroy();
            // mainWindow.close();
            app.exit();
            // app.quit();
          }
        })
        .catch((err) => {
          console.log(err);
        });
    };
    showMessageBoxTC();
    // if (mainWindow2) {
    // mainWindow2.destroy();
    // mainWindow2.close();
    // app.quit();
    // }
  }); //createWindow END

  // 获取打印机列表
  // console.log('获取打印机列表',mainWindow.webContents.getPrinters());//弃用
  const Print_Li = async (e) => {
    const data = await mainWindow.webContents.getPrintersAsync();
    console.log(e, data);
  };
  Print_Li("获取打印机列表");

  // https://www.electronjs.org/zh/docs/latest/api/web-contents#contentsprintoptions-callback
  // 打印参数
  const options = {
    silent: true, //静默打印
    deviceName: "XP-58", //选择打印机驱动名
    printBackground: true, //打印网页的背景颜色和图像。默认值为 false
    color: true, //是否打印网页颜色。默认值为 true
    margins: {
      marginType: "none", //string边距类型：none,top,bottom,left,right
      top: 0, //number上边距，以像素为单位
      bottom: 0, //number底部边距，以像素为单位
      left: 0, //number左边距，以像素为单位
      right: 0, //number右边距，以像素为单位
    },
    landscape: false, // 是否以横屏模式打印网页。默认值为 false
    scaleFactor: 100, // number(可选)-网页的比例因子。
    pagesPerSheet: 1, //  number(可选)-每张纸的页数
    collate: true, // boolean(可选)-是否对网页进行排序。
    copies: 0, // number 影印数(可选)-要打印的网页影印数。
    pageRanges: [
      {
        from: 0,
        to: 1,
      },
    ], //要打印的页面范围。 在macOS上，只有数组的第一个值被信任。
    duplexMode: "simplex", // 打印模式 simplex,shortEdge,longEdge
    dpi: 100, // <string, number> 打印机DPI
    header: "", // string 打印头
    footer: "", // string 打印尾
    pageSize: 1024 * 58, // string | Size打印纸张 A0, A1, A2, A3, A4, A5, A6, Legal, Letter, Tabloid or an Object containing height and width.
  };
  // 使用 page-break-before: always; CSS 样式强制打印到新页面。
  // 打印当前窗口html
  mainWindow.webContents.print(options, (success, errorType) => {
    if (!success) console.log(errorType);
  });
}; //第一个窗口 END
// 第二个窗口
const createWindow2 = (url, op) => {
  mainWindow2 = new BrowserWindow({
    // fullscreen:true,
    // x: externalDisplay.bounds.x,
    // y: externalDisplay.bounds.y,
    x: 100,
    y: 100,
    maximizable: true, //支持最大化
    show: false, //为了让初始化窗口显示无闪烁，先关闭显示，等待加载完成后再显示。
    // autoHideMenuBar: true,//隐藏菜单
    webPreferences: {
      nodeIntegration: true, // 是否集成 Nodejs
      //配置预加载脚本文件(preload)，此处起名为preloadOther
      //p.s.路径为绝对路径
      // preload: require('path').join(app.getAppPath(), 'preloadOther.js')
    },
  });
  //指定副屏幕打开的网页
  mainWindow2.loadURL("https://www.w3cschool.cn/electronmanual/82vz1ql9.html");
  // mainWindow2.setAutoHideMenuBar(true); //自动隐藏菜单
  // mainWindow2.setMenu(null); //隐藏菜单
  // mainWindow2.setIgnoreMouseEvents(true); // 鼠标穿透
  // mainWindow2.setAlwaysOnTop(true); // 保持置顶
  // mainWindow2.setSkipTaskbar(true); // 无任务栏图标
  // mainWindow2.setKiosk(true); // 设置窗口为全屏显示
  mainWindow2.show();
  mainWindow2.on("closed", () => {
    mainWindow2 = null; //这一段放外面的话，如果你电脑没双屏会报错。
  });
  // mainWindow2.hide(); /*隐藏当前窗口*/
  //主进程监听事件示例(用于双屏之间的通信)
  //需要预先引入 import { ipcMain } from 'electron'
  // ipcMain.on('pay-start', (event, detail) => {
  //   mainWindow2.webContents.send('pay-start', detail);
  // })
}; //第二个窗口 END

/**
 *
 *
 */
// Electron 初始化完成
app.whenReady().then(() => {
  const displays = screen.getAllDisplays(); // 显示器数量列表数组
  // console.log("显示器：", displays);
  // 从数组中返回副屏数据
  const externalDisplay = displays.find((display) => {
    return display.bounds.x !== 0 || display.bounds.y !== 0;
  });
  // console.log("externalDisplay：", externalDisplay);
  // 副屏显示器存在，创建窗口定位xY轴到副屏位置
  if (externalDisplay) {
    // console.log("=====");
  }
  createWindow("index.html", []); //第一个窗口
  // createWindow2(); //第二个窗口

  // 如果没有窗口打开则打开一个窗口 (macOS)
  app.on("activate", () => {
    // 点击托盘图标时通常会重新创建一个新窗口
    if (BrowserWindow.getAllWindows().length === 0) {
      createWindow("index.html", []);
    }
  });
  // 关闭所有窗口时退出应用 (Windows & Linux)
  app.on("window-all-closed", () => {
    //非macOS系统
    if (process.platform !== "darwin") {
      app.quit();
    }
  });
}); // Electron 初始化完成
